/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tomasio.projects.welcome.model;

import com.tomasio.projects.welcome.dto.AutorizacaoDeAcessoColetivaDTO;
import com.tomasio.projects.welcome.dto.AutorizacaoDeAcessoDTO;
import com.tomasio.projects.welcome.dto.AutorizacaoDeAcessoIndividualDTO;
import com.tomasio.projects.welcome.dto.BloqueioDeAcessoDTO;
import com.tomasio.projects.welcome.dto.MovimentacaoDTO;
import java.util.HashSet;
import java.util.Set;

/**
 *
 * @author administrador
 */
public abstract class AutorizacaoDeAcesso {

    private Long id;
    
//    private Set<Foto> fotos = new HashSet<Foto>();
    private Cartao cartao;
    private Set<BloqueioDeAcesso> bloqueios = new HashSet<BloqueioDeAcesso>();
    private Long transeunteId;
    private Set<Movimentacao> movimentacoes = new HashSet<Movimentacao>();

    public AutorizacaoDeAcesso() {
    }

    public Set<Movimentacao> getMovimentacoes() {
        return movimentacoes;
    }

    public void setMovimentacoes(Set<Movimentacao> movimentacoes) {
        this.movimentacoes = movimentacoes;
    }

    public void addMovimentacoes(Movimentacao movimentacao) {
        this.movimentacoes.add(movimentacao);
    }

    public Set<BloqueioDeAcesso> getBloqueios() {
        return bloqueios;
    }

    public void setBloqueios(Set<BloqueioDeAcesso> bloqueios) {
        this.bloqueios = bloqueios;
    }

    public Cartao getCartao() {
        return cartao;
    }

    public void setCartao(Cartao cartao) {
        this.cartao = cartao;
    }

    

//    public Set<Foto> getFotos() {
//        return fotos;
//    }
//
//    public void setFotos(Set<Foto> fotos) {
//        this.fotos = fotos;
//    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public abstract Periodo getPeriodo();

    public abstract String getDocumento();

    public Long getTranseunteId() {
        return transeunteId;
    }

    public void setTranseunteId(Long transeunteId) {
        this.transeunteId = transeunteId;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final AutorizacaoDeAcesso other = (AutorizacaoDeAcesso) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 31 * hash + (this.id != null ? this.id.hashCode() : 0);
        return hash;
    }

    public AutorizacaoDeAcessoDTO createDTO() {
        AutorizacaoDeAcessoDTO dto = instantiateDTO();

        if (cartao != null) {
            dto.setCartao(cartao.createDTO());
        }
        
        dto.setId(id);
        dto.setTranseunteId(transeunteId);
        Set<BloqueioDeAcessoDTO> bloqueiosDTO = new HashSet<BloqueioDeAcessoDTO>();
        for (BloqueioDeAcesso bloqueio : bloqueios) {
            bloqueiosDTO.add(bloqueio.createDTO());
        }
        dto.setBloqueios(bloqueiosDTO);
        Set<MovimentacaoDTO> movimentacoesDTO = new HashSet<MovimentacaoDTO>();
        for (Movimentacao movimentacao : movimentacoes) {
            movimentacoesDTO.add(movimentacao.createDTO());
        }
        dto.setMovimentacoes(movimentacoesDTO);

//        Set<FotoDTO> fotosDTO = new HashSet<FotoDTO>();
//        for (Foto foto : fotos) {
//            fotosDTO.add(foto.createDTO());
//        }
//        dto.setFotos(fotosDTO);


        return dto;
    }

    protected abstract AutorizacaoDeAcessoDTO instantiateDTO();

    public void fillAttributesFromDTO(AutorizacaoDeAcessoDTO dto) {
        this.id = dto.getId();
        this.transeunteId = dto.getTranseunteId();
        this.cartao = new Cartao(dto.getCartao());
        

        if (dto.getTranseunte() != null) {
            transeunteId = dto.getTranseunte().getId();
        }


        for (BloqueioDeAcessoDTO bloqueiosDTO : dto.getBloqueios()) {
            bloqueios.add(new BloqueioDeAcesso(bloqueiosDTO));
        }

        for (MovimentacaoDTO movimentacaoDTO : dto.getMovimentacoes()) {

            movimentacoes.add(Movimentacao.instantiate(movimentacaoDTO));
        }


//        for (FotoDTO fotoDTO : dto.getFotos()) {
//            fotos.add(new Foto(fotoDTO));
//        }


    }

    public static AutorizacaoDeAcesso instantiate(AutorizacaoDeAcessoDTO dto) {
        if (dto instanceof AutorizacaoDeAcessoColetivaDTO) {
            AutorizacaoDeAcessoColetiva autorizacao =  new AutorizacaoDeAcessoColetiva();
            autorizacao.fill((AutorizacaoDeAcessoColetivaDTO) dto);
            return autorizacao;
        } else {
            return new AutorizacaoDeAcessoIndividual(
                    (AutorizacaoDeAcessoIndividualDTO) dto);
        }
    }
}
